// 定义汽车类，属性：name，方法：speed(),返回number，固定返回1，定义构造方法，传入name构造汽车
//    定义跑车类，继承汽车类，重写speed()方法，要求返回2倍父类的速度做为结果，定义构造方法，调用父类构造方法，传入固定值“跑车”构造。
//    定义货车类，继承汽车类，重写speed()方法，要求返回0.5倍父类的速度做为结果，定义构造方法，调用父类构造方法，传入固定值“卡车”构造。
class Car {
    name: string;

    constructor(name:string) {
        this.name = name;
    }

    speed():number {
        return 1;
    }

}

class SportsCar extends Car {

    constructor() {
        super("跑车");
    }

    speed():number {
        return 2 * super.speed();
    }
}

class Truck extends Car {

    constructor() {
        super("卡车");
    }

    speed():number {
        return 0.5 * super.speed();
    }
}


// 定义驾驶员类，属性：name，方法：drive(),返回number，固定返回1，定义构造方法，传入name构造驾驶员
//   定义赛车手类，继承驾驶员类，重写drive()方法，要求返回1.5倍父类的drive()值做为结果，定义构造方法，调用父类构造方法，传入固定值“赛车手”构造。
class Driver {

    name:string;

    constructor(name:string) {
        this.name = name;
    }

    drive():number {
        return 1;
    }

}

class Racer extends Driver {

    constructor() {
        super("赛车手")
    }

    drive():number {
        return 2 * super.drive();
    }

}

// 编写一个方法run()，返回数值类型，传入两个参数：驾驶员和汽车，返回行驶100距离的时间结果。
//  run()方法打印：我是XXX（驾驶员|赛车手），我驾驶XXX（汽车|跑车|卡车），我花费XXX时长开完100距离
//  分别创建普通汽车、跑车、货车、普通驾驶员、赛车手。两两组合调用上面的run()方法
function run(driver:Driver,car:Car):number {
    let cast = 100 / (driver.drive() * car.speed());
    console.log(`我是${driver.name}，我驾驶${car.name}，我花费${cast}时长开完100距离`)
    return cast;
}

let d1:Driver = new Driver("普通驾驶员");
let d2:Driver = new Racer();

let c1:Car = new Car("普通汽车");
let c2:Car = new SportsCar();
let c3:Car = new Truck();

run(d1,c1);
run(d1,c2);
run(d1,c3);

run(d2,c1);
run(d2,c2);
run(d2,c3);